---
description: SDD가 정의한 하드웨어 추상화 인터페이스를 대체하는 시뮬레이터를 test/simulator/에 작성한다. 시스템 테스트의 기반.
---

# /simulator — Hardware Simulator

> **정책**
> 시뮬레이터는 **SDD가 정의한 추상화 인터페이스**를 대체한다.
> 인터페이스 이름·메서드 시그니처는 SDD/실제 헤더를 따른다 (PDF의 `IMotor`·`ICleaner`·`ISensor`를 가정하지 않는다 — SDD가 다른 이름을 정했다면 그 이름의 시뮬레이터를 만든다).

## 0. 로그 시작

```bash
TS=$(date +%Y-%m-%d_%H%M)
echo "# /simulator" > log/${TS}_simulator.md
echo "" >> log/${TS}_simulator.md
echo "## 사용 프롬프트" >> log/${TS}_simulator.md
echo "\`/simulator\`" >> log/${TS}_simulator.md
```

## 1. 입력

- `include/` 의 하드웨어/외부 환경 추상화 인터페이스 (이름·위치는 SDD가 결정)
- `docs/sdd/SDD.md` (4절 추상화 인터페이스, 6절 시퀀스, 10절 테스트 가능성)
- `docs/srs/SRS.md` (UC 시나리오 — 시뮬레이터가 충족해야 할 환경 입력)

## 2. 시뮬레이터 구성 도출

1. `include/`에서 **SDD가 정의한 모든 추상화 인터페이스**를 식별.
2. 각 인터페이스마다 대응되는 Sim 구현을 둔다 (파일명은 인터페이스 이름을 따라 자연스럽게 — 예: `<Interface>` → `Sim<Interface>`).
3. 시스템 테스트가 환경을 주입하고 결과를 관찰할 수 있도록 **테스트 하니스 클래스** 1개를 둔다 (이름은 자유, 예: `RVCSimulator` 또는 SDD가 권한 다른 이름).

## 3. 산출물

`test/simulator/` 아래 (실제 파일명은 위 1·2단계에서 도출):

- 각 추상화 인터페이스에 대한 Sim 구현 — 호출 이력과 현재 상태를 저장
- 테스트 하니스 — 다음을 노출:
  - **환경 주입 API**: 외부 자극(센서 감지 여부, 사용자 입력 등)을 테스트에서 제어
  - **상태 쿼리 API**: 시스템 동작 결과(구동 상태, 모드, 출력 메시지 등)를 테스트에서 검증
  - **입력 시퀀스 API**: 사용자 명령(예: 전원 ON/OFF)을 시스템에 전달

API 이름은 SDD의 인터페이스 메서드명과 일관되게 짓는다.

## 4. 설계 규칙

- 시뮬레이터는 **테스트 전용**. production 의존성 그래프(`rvc_core`)에 들어가지 않고, 시스템 테스트 실행파일에서만 링크된다.
- 시뮬레이터는 실제 하드웨어 동작을 흉내내지 않고 **상태 머신과 호출 이력만** 기록한다 (검증 가능성 우선).
- 출력 캡처는 SDD가 정한 출력 통제점에 대한 의존성 주입을 통해 수행. `testing::internal::CaptureStdout()`은 최후의 수단.
- PDF의 `IMotor`·`ICleaner`·`ISensor` 같은 이름을 가정하지 않는다. SDD가 다른 이름을 정했다면 그 이름을 따른다.

## 5. 빌드 검증 (WSL)

```bash
wsl bash -lc "cd '$(pwd)' && cmake --build build -j --target oop_system_test"
```

빌드 성공 시 본 단계 완료. (실제 시나리오는 `/st`에서 작성·실행)

## 6. 자기 점검

- [ ] SDD가 정의한 모든 추상화 인터페이스에 대해 Sim 구현이 존재하는가?
- [ ] 환경 주입 API가 SRS의 모든 외부 자극을 시뮬레이션할 수 있는가? (장애물·먼지·사용자 입력 등)
- [ ] 상태 쿼리 API가 SRS의 모든 검증 시그널을 노출하는가?
- [ ] Sim 클래스가 production 코드를 오염시키지 않는가? (`src/`·`include/`에 들어가지 않았는가?)
- [ ] 시뮬레이터 인터페이스명이 SDD가 정한 추상화 이름과 일관된가?

## 7. 로그 종료

`log/${TS}_simulator.md`에 채움:
- `## 주요 결정`: 환경 주입 API 설계, 출력 캡처 방식, 상태 머신 범위, SDD에서 명시되지 않아 보강한 항목
- `## 생성·수정 파일`: 시뮬레이터 파일 목록
- `## 결과 요약`: 노출된 환경 주입 API 수, 상태 쿼리 API 수, Sim 구현 수
- `## 검증 방법`: 위 cmake 빌드 명령
- `## 다음 단계`: `/st`
